﻿using System;
using System.Windows.Forms;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using System.Text;
using System.Xml;
using System.Security.Cryptography;
using GridviewToExcel;

namespace TPDiseño
{
    class Funciones
    {
        public static List<Pregunta> obtenerPreguntasAleatriamente(List<Pregunta> list)
        {
            // Hago una lista copia de la original
            List<Pregunta> copiaOriginal = new List<Pregunta>(list);
            // La lista de preguntas aleatoreas
            List<Pregunta> randomizedList = new List<Pregunta>();

            // Hago un retardo para variar la semilla de generacion de la funcion randon
            System.Threading.Thread.Sleep(1200); // Delay de 1,2 Segundo !
            
            // Objeto de generacion aleatorea
            Random rnd = new Random();
                       
            // Genero solo hasta 5 pregutnas al azar
            while ((copiaOriginal.Count > 0) && (randomizedList.Count < 5))
            {
                int index = rnd.Next(0, copiaOriginal.Count); //pick a random item from the master list 
                randomizedList.Add(copiaOriginal[index]); //place it at the end of the randomized list 
                copiaOriginal.RemoveAt(index);
            }

            return randomizedList;
        }

     
        public static List<DTO_s.DTOPreguntasOpRta> obtenerPreguntasAleatriamente(List<DTO_s.DTOPreguntasOpRta> list)
        {
            List<DTO_s.DTOPreguntasOpRta> randomizedList = new List<DTO_s.DTOPreguntasOpRta>();
            Random rnd = new Random();

            while (list.Count > 0)
            {
                int index = rnd.Next(0, list.Count); //pick a random item from the master list 
                randomizedList.Add(list[index]); //place it at the end of the randomized list 
                list.RemoveAt(index);
            }

            return randomizedList;
        }


        public static DTO_s.DTOTiempoConfiguracion obtenerConfiguracion()
        {

            // Cargo el archivo de configuracion (el XML)
            XmlDocument xDoc = cargarConfiguracionDesdeXLM();
            
            // Obtengo el nodo de configuracion
            XmlNodeList Configuración = xDoc.GetElementsByTagName("Configuración");
            // luego obtengo el nodo de tiempo
            XmlNodeList tiempo = ((XmlElement)Configuración[0]).GetElementsByTagName("Tiempo");
            // Por ultimo los notos de tiempo inicio y final respectibamente
            XmlNodeList tiempoInicio = ((XmlElement)tiempo[0]).GetElementsByTagName("Inicio");
            XmlNodeList tiempoFinal = ((XmlElement)tiempo[0]).GetElementsByTagName("Final");

            XmlNodeList tiempoMaximo = ((XmlElement)tiempo[0]).GetElementsByTagName("Durecion");


            // Creo un objeto tiempo limite con la configuracion del XML
            DTO_s.DTOTiempoConfiguracion miTiempoLimite = new DTO_s.DTOTiempoConfiguracion(Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("Año")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("Mes")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("Dia")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("hora")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("Minuto")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoInicio[0]).GetAttribute("Segundo")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("Año")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("Mes")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("Dia")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("hora")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("Minuto")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoFinal[0]).GetAttribute("Segundo")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoMaximo[0]).GetAttribute("Hora")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoMaximo[0]).GetAttribute("Minuto")),
                                                                                           Convert.ToInt32(((XmlElement)tiempoMaximo[0]).GetAttribute("Segundo"))
                                                                                           );
            // Finalmente retorno el tiempo limite
            return miTiempoLimite;

        }

        public static int obtenerConfiguracionPreguntasPorBloques()
        {

            // Cargo el archivo de configuracion (el XML)
            XmlDocument xDoc = cargarConfiguracionDesdeXLM();

            // Obtengo el nodo de configuracion
            XmlNodeList Configuración = xDoc.GetElementsByTagName("Configuración");
            // luego obtengo el nodo de cuestionario
            XmlNodeList cuestionario = ((XmlElement)Configuración[0]).GetElementsByTagName("Cuestionario");
            // Finalmente el nodo de las preguntas por bloque
            XmlNodeList preguntasPorBloque = ((XmlElement)cuestionario[0]).GetElementsByTagName("PreguntasPorBloque");

            // Retorno el valor de atributo "Cantidad" que es el numero de preguntas por bloque
            return Convert.ToInt32(((XmlElement)preguntasPorBloque[0]).GetAttribute("Cantidad"));
        }

        public static XmlDocument cargarConfiguracionDesdeXLM()
        {
            // Obtengo un objeto para manejar documentos XLM
            XmlDocument xDoc = new XmlDocument();
            // Cargo el archivo donde esta la configuracion
            xDoc.Load("../../XMLFile1.xml");
            // Finalmente lo retorno
            return xDoc;
        }


        public static string GetMD5(string str)
        {
            // Objeto generador de encriptacion MD5
            MD5 md5 = MD5CryptoServiceProvider.Create();
            // Objeto de codigo ASCII
            ASCIIEncoding encoding = new ASCIIEncoding();
            // Stream donde se va a generar la clve
            byte[] stream = null;
            // Construyo la cadena
            StringBuilder sb = new StringBuilder();
            // Genero el estream apartir de str
            stream = md5.ComputeHash(encoding.GetBytes(str));
            // Formateo la cadena
            for (int i = 0; i < stream.Length; i++) sb.AppendFormat("{0:x2}", stream[i]);
            // Finalmente retorno del md5 generado solo sus primeros ocho caracteres
            return sb.ToString().Substring(0, 8);
        }

        public static void ExportarAexel(string ruta, string nombreDeHoja, DataGridView dataGridView)
        {
            // Instancio la libreria para exportar a ecel
            export2Excel miEportarEcel = new export2Excel();

            miEportarEcel.ExportToExcel(ToDataView(dataGridView, "Candidatos"), ruta, "Candidatos");
        }

        // Genera un DataView con los datos de la grillas
        private static System.Data.DataView ToDataView(DataGridView dataGridView, string tableName)
        {
            var dgv = dataGridView;
            var table = new System.Data.DataTable(tableName);

            // Crea las columnas 
            for (var iCol = 0; iCol < dgv.Columns.Count; iCol++)
            {
                table.Columns.Add(dgv.Columns[iCol].HeaderText);
            }

            // Agrega las filas 
            for (var i = 0; i < dgv.Rows.Count; i++)
            {
                // Obtiene el DataBound de la fila y copia los valores de la fila 
                DTO_s.DTOCandidatoClave unCandidato = (DTO_s.DTOCandidatoClave)dgv.Rows[i].DataBoundItem;

                // Agrega la fila clonada                 
                table.Rows.Add(unCandidato.toArray());
            }

            return table.DefaultView;
        }
    }
}
